package org.study.util;

import java.util.ArrayList;
import java.util.List;

/**
 * 自定义 List 工具类
 *
 * @author Administrator
 * @date 2021-11-23
 */
public class ListUtils {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        for (int i = 0; i < 11; i++) {
            list.add(i);
        }
        List<List<Integer>> segment = splitBySegment(list, 3);
        System.out.println("按段数分割：" + segment);
        List<List<Integer>> count = splitByCount(list, 3);
        System.out.println("按大小分割：" + count);
    }

    /**
     * 分割 List：按段数分割。注意：多出部分数据在最后一个 List 中
     *
     * @param data     被分割的数据
     * @param segments 需要分割的段数
     * @return
     */
    public static <T> List<List<T>> splitBySegment(List<T> data, int segments) {
        List<List<T>> result = new ArrayList<>();
        // 数据长度
        int size = data.size();
        if (size > 0 && segments > 0) {
            // 每段数量
            int count = size / segments;
            for (int i = 0; i < segments; i++) {
                // 每段 List
                List<T> subList = null;
                if (i == segments - 1) {
                    subList = data.subList(count * i, size);
                } else {
                    subList = data.subList(count * i, count * (i + 1));
                }
                result.add(subList);
            }
        } else {
            // segments == 0 不需要分隔
            result.add(data);
        }
        return result;
    }

    /**
     * 分割 List：按大小分割
     *
     * @param data    被分割的数据
     * @param subSize 分割后每段大小
     * @return
     */
    public static <T> List<List<T>> splitByCount(List<T> data, int subSize) {
        List<List<T>> result = new ArrayList<>();
        // 数据长度
        int size = data.size();
        if (size > 0 && subSize > 0) {
            // 商
            int segments = size / subSize;
            // 段数：整除则分隔为 segments 段，除不尽则分隔为 segments + 1 段
            segments = size % subSize == 0 ? segments : segments + 1;
            for (int i = 0; i < segments; i++) {
                // 每段 List
                List<T> subList = null;
                if (i == segments - 1) {
                    subList = data.subList(subSize * i, size);
                } else {
                    subList = data.subList(subSize * i, subSize * (i + 1));
                }
                result.add(subList);
            }
        } else {
            result.add(data);
        }
        return result;
    }
}
